home *** CD-ROM | disk | FTP | other *** search
- /* listpci.c - list all configured PCI cards in the system */
- /* build using SAS C v 6.58 */
- /* sc link listpci */
-
- #include <exec/libraries.h>
- #include <clib/exec_protos.h>
-
- #include <libraries/pciexpansionbase.h>
- #include <clib/pciexpansion_protos.h>
- #include <pragmas/pciexpansion_pragmas.h>
-
- #include <stdio.h>
-
-
- extern struct PCIExpBase * PCIExpansionBase = NULL;
-
- char __stdiowin[]="CON:0/10/620/240/list pci";
- char __stdiov37[]="/CLOSE/WAIT";
-
-
-
-
- /* selction criteria to list operation */
- /* add/remove items to change criteria */
- /* example:
- {PCIE_VENDORID, 0x5333}, - S3 Incorporated 'S' = 0x53, '3' = 0x33 :)))
- {PCIE_BASECLASSCODE, 0x3},
- */
- struct TagItem tags[] = {
- {TAG_DONE, 0 }
- };
-
-
- /* abbr. of card sizes */
- char * sizes[] = { " 1 byte ", " 2 bytes ", " 4 bytes ", " 8 bytes ",
- " 16 bytes ", " 32 bytes ", " 64 bytes ", " 128 bytes ",
- " 256 bytes ", " 512 bytes ", " 1 KB ", " 2 KB ",
- " 4 KB ", " 8 KB ", " 16 KB ", " 32 KB ",
- " 64 KB ", " 128 KB ", " 256 KB ", " 512 KB ",
- " 1 MB ", " 2 MB ", " 4 MB ", " 8 MB ",
- " 16 MB ", " 32 MB ", " 64 MB ", " 128 MB ",
- " 256 MB ", " 512 MB ", " 1 GB ", " 2 GB ",
- " 4 GB " };
-
-
- /* separated function to recognize card type */
- /* - a lot of switch'es */
- void type_recognize(struct pci_class * class_reg)
- {
- switch (class_reg->base)
- {
- case 0x00: /* old style device */
- /* built before Class Code definitions */
- /* were finalized */
- printf("old style device : ");
- switch (class_reg->sub)
- {
- case 0x1: /* VGA-compabible device */
- printf("VGA-compatible device");
- break;
- case 0x0: /* all devices except VGAs */
- printf("no VGA device");
- break;
- default: printf("undefined");
- break;
- }
- break;
- case 0x01: printf("mass storage controller : ");
- switch (class_reg->sub)
- {
- case 0x00: printf("SCSI bus controller");
- break;
- case 0x01: printf("IDE bus controller");
- break;
- case 0x02: printf("Floppy disk controller");
- break;
- case 0x03: printf("IPI bus controller");
- break;
- case 0x04: printf("RAID controller");
- break;
- case 0x80: printf("other");
- break;
- default: printf("undefined");
- break;
- }
- break;
- case 0x02: printf("Network controller : ");
- switch (class_reg->sub)
- {
- case 0x00: printf("Ethernet controller");
- break;
- case 0x01: printf("Token Ring controller");
- break;
- case 0x02: printf("FDDI controller");
- break;
- case 0x03: printf("ATM controller");
- break;
- case 0x80: printf("other");
- break;
- default: printf("undefined");
- break;
- }
- break;
- case 0x03: switch (class_reg->sub)
- {
- case 0x00: if (class_reg->prog==0)
- printf("VGA compatible");
- else
- printf("8514 compatible");
- break;
- case 0x01: printf("XGA controller");
- break;
- case 0x80: printf("other");
- break;
- default: printf("undefined");
- break;
- }
- printf(" display controller");
- break;
- case 0x04: switch (class_reg->sub)
- {
- case 0x00: printf("Video");
- break;
- case 0x01: printf("Audio");
- break;
- case 0x80: printf("other");
- break;
- default: printf("undefined");
- break;
- }
- printf(" multimedia device");
- break;
- case 0x05: switch (class_reg->sub)
- {
- case 0x00: printf("RAM ");
- break;
- case 0x01: printf("Flash ");
- break;
- case 0x80: printf("other ");
- break;
- default: printf("undefined ");
- break;
- }
- printf("memory controller");
- break;
- case 0x06: switch (class_reg->sub)
- {
- case 0x00: printf("Host");
- break;
- case 0x01: printf("ISA");
- break;
- case 0x02: printf("EISA");
- break;
- case 0x03: printf("MCA");
- break;
- case 0x04: printf("PCI-to-PCI");
- break;
- case 0x05: printf("PCMCIA");
- break;
- case 0x06: printf("NuBus");
- break;
- case 0x07: printf("CardBus");
- break;
- case 0x80: printf("other");
- break;
- default: printf("undefined");
- break;
- }
- printf(" bridge device");
- break;
- case 0x07: printf("Simple ");
- switch (class_reg->sub)
- {
- case 0x00: printf("serial");
- break;
- case 0x01: printf("paraller");
- break;
- case 0x80: printf("other");
- break;
- default: printf("undefined");
- break;
- }
- printf(" communication controller");
- break;
- case 0x08: printf(" PC base system pripherials");
- break;
- case 0x09: printf("Input device : ");
- switch (class_reg->sub)
- {
- case 0x00: printf("keyboard controller");
- break;
- case 0x01: printf("Digitizer (pen)");
- break;
- case 0x02: printf("Mouse controller");
- break;
- case 0x80: printf("other");
- break;
- default: printf("undefined");
- break;
- }
- break;
- case 0x0A: printf("docking station ");
- case 0x0B: switch (class_reg->sub)
- {
- case 0x00: printf("386 ");
- break;
- case 0x01: printf("486 ");
- break;
- case 0x02: printf("Pentium ");
- break;
- case 0x10: printf("Alpha ");
- break;
- case 0x20: printf("PowerPC ");
- break;
- case 0x40: printf("Co-");
- break;
- default: printf("undefined ");
- break;
- }
- printf("processor");
- break;
- case 0x0C: /* Serial bus controllers */
- switch (class_reg->sub)
- {
- case 0x00: printf("FireWire (IEEE 1394) ");
- break;
- case 0x01: printf("ACCESS.bus.");
- break;
- case 0x02: printf("SSA ");
- break;
- case 0x03: printf("USB ");
- break;
- case 0x04: printf("Fibre Channel ");
- break;
- default: printf("undefined ");
- break;
- }
- printf("serial bus controller");
- break;
- case 0xFF: printf("Device does not fit in any defined classes");
- break;
- }
- }
-
-
- int main(int argc, char * argv[])
- {
- struct PCIConfDev * pcidev = NULL;
- int a;
- ULONG adr;
-
- PCIExpansionBase = (struct PCIExpBase *)OpenLibrary(PCIEXPANSIONNAME,0L);
- if (PCIExpansionBase)
- {
- while (pcidev = FindPCIDev(pcidev,tags))
- {
- /* print out card information */
- /* VENDOR, DEVICE */
- printf("PCI card in slot no %2d : ",pcidev->SlotNo);
- printf("Vendor ID = %04X, Device ID = %04X\n", pcidev->Config.pcie_id.vid,
- pcidev->Config.pcie_id.did);
- /* device type(class) */
- printf(" Device type : ");
- type_recognize(&pcidev->Config.pcie_class);
- printf("\n");
- for (a = 0; a<6; a++)
- {
- adr = pcidev->Config.pcie_baddr[a].valUlong;
- if (adr)
- {
- printf(" Card addr. no %d = 0x%08X", a, adr & 0xFFFFFFF0);
- if (pcidev->Config.pcie_baddr[a].pcie_mem_addr.space)
- printf(" in IO space");
- else
- printf(" in MEMORY space");
- printf(" uses %s \n", sizes[pcidev->Size[a]]);
- }
- }
- if (pcidev->Config.pcie_rom_addr.bits.ena)
- {
- printf(" Rom address = 0x%08X in MEMORY space", pcidev->Config.pcie_rom_addr.valUlong & 0xFFFFFFF0);
- printf(" uses %s \n", sizes[pcidev->Size[6]]);
- }
- else
- printf(" No ROM\n");
- if (pcidev->Config.pcie_misc1.int_pin)
- {
- printf(" Device uses INT%c# interrupt line",
- pcidev->Config.pcie_misc1.int_pin+'@');
- if (pcidev->Config.pcie_misc1.int_line)
- printf(" use AddIntServer(%d,...) \n", pcidev->Config.pcie_misc1.int_line);
- else
- printf(" not connected to CPU\n");
- }
- else
- printf(" Device does not use interrupts\n");
- }
- CloseLibrary((struct Library *)PCIExpansionBase);
- }
- else
- printf("Unable to open pciexpansion.library\n");
- }
-
-